#include <iostream>

void func(int &ref)
{
    std::cout << "ref = " << ref << std::endl;   // 输出引用的值（与原始变量相同）
    std::cout << "&ref = " << &ref << std::endl; // 输出引用的地址（与原始变量相同）
    ref = 1090;                                  // 修改引用，实际上修改了原始变量
    std::cout << "ref = " << ref << std::endl;   // 输出引用的新值（1090，与原始变量相同）
    std::cout << "&ref = " << &ref << std::endl; // 输出引用的地址（与原始变量相同）
}

int main(int argc, char const *argv[])
{
    int a = 100;
    std::cout << "a = " << a << std::endl;   // 输出原始变量的值（100）
    std::cout << "&a = " << &a << std::endl; // 输出原始变量的地址

    int &ref = a;                                // 创建引用ref，指向原始变量a
    std::cout << "ref = " << ref << std::endl;   // 输出引用的值（与原始变量相同）
    std::cout << "&ref = " << &ref << std::endl; // 输出引用的地址（与原始变量相同）

    std::cout << "***********************" << std::endl;

    func(a); // 将原始变量a传递给函数

    std::cout << "a = " << a << std::endl;       // 输出原始变量的新值（被函数修改为1090）
    std::cout << "&a = " << &a << std::endl;     // 输出原始变量的地址
    std::cout << "ref = " << ref << std::endl;   // 输出引用的值（与原始变量相同，因为引用和原始变量指向同一块内存）
    std::cout << "&ref = " << &ref << std::endl; // 输出引用的地址（与原始变量相同）

    std::cout << "***********************" << std::endl;

    func(ref); // 再次将引用ref传递给函数

    std::cout << "a = " << a << std::endl;       // 输出原始变量的新值（再次被函数修改为1090）
    std::cout << "&a = " << &a << std::endl;     // 输出原始变量的地址
    std::cout << "ref = " << ref << std::endl;   // 输出引用的值（与原始变量相同，因为引用和原始变量指向同一块内存）
    std::cout << "&ref = " << &ref << std::endl; // 输出引用的地址（与原始变量相同）

    return 0;
}

/*

    地址和值都是一样的，传入引用就相当于传它本身

    输出：
            a = 100
            &a = 0x7fffffffe01c
            ref = 100
            &ref = 0x7fffffffe01c
        ***********************
            ref = 100
            &ref = 0x7fffffffe01c
            ref = 1090
            &ref = 0x7fffffffe01c
            a = 1090
            &a = 0x7fffffffe01c
            ref = 1090
            &ref = 0x7fffffffe01c
        ***********************
            ref = 1090
            &ref = 0x7fffffffe01c
            ref = 1090
            &ref = 0x7fffffffe01c
            a = 1090
            &a = 0x7fffffffe01c
            ref = 1090
            &ref = 0x7fffffffe01c
*/